#include <my_header.h>


/* Usage: ./1_sigaction */
void func(int sig_val)
{
    printf("begin\n");
    // 打印传过来的处理信号
    printf("sigint:%d\n", sig_val);


    sigset_t set;
    sigemptyset(&set);
    // 检查未决信号集(即：3号信号)
    sigpending(&set);
    // 检查特定信号 是否在信号集中
    if(sigismember(&set, SIGQUIT))
    {
        printf("3号信号未决！\n");
    }
    printf("over \n");
}
int main(void){ 
    
    // 使用sigaction注册2号信号的处理函数
    struct sigaction act, old;
    memset(&act, 0, sizeof(act));
    // 2号信号的处理函数
    act.sa_handler = func;
    // 允许自动重启低系统调用
    act.sa_flags = SA_RESTART;


    
    sigset_t set;
    sigemptyset(&set);
    sigaddset(&set, SIGQUIT);
    // 3号信号全程阻塞
    sigprocmask(SIG_BLOCK, &set, NULL);
    // 或临时阻塞
    // act.sa_mask = set;
    // 将信号处理动作注册到信号2（SIGINT，即 Ctrl+C 中断信号）
    sigaction(SIGINT, &act, &old);
    
    char buf[60] = {0};
    read(STDIN_FILENO, buf, sizeof(buf));
    printf("buf: %s \n", buf);

    return 0;
}

#if 0
使用sigaction注册2号信号的处理函数
1） 允许自动重启低速系统调用
2）在处理2号信号时阻塞3号信号，不会被3号信号打断；
3)  在2号信号的信号处理函数中，使用sigpending函数
判断一下有没有3号信号处于未决状态；
#endif
